ํ์ด์ฌ์ email ํจํค์ง๋ฅผ ์ฌ์ฉํ์ฌ MIME ๋ฉ์์ง๋ฅผ ๊ตฌ์ฑ, ์ ์ก ๋ฐ ํ์ฑํ๋ ํฌ๊ด์ ์ธ ๊ฐ์ด๋์ ๋๋ค. ์ค์ฉ์ ์ธ ์์ ์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ ๊ณตํฉ๋๋ค.
ํ์ด์ฌ ์ด๋ฉ์ผ ํจํค์ง: MIME ๋ฉ์์ง ๊ตฌ์ฑ ๋ฐ ํ์ฑ
์ด๋ฉ์ผ์ ์ ์ธ๊ณ ๊ฐ์ธ๊ณผ ์กฐ์ง์ ์ํ ์ค์ํ ์ปค๋ฎค๋์ผ์ด์
๋๊ตฌ๋ก ๋จ์ ์์ต๋๋ค. ํ์ด์ฌ์ ๋ด์ฅ email
ํจํค์ง๋ ํนํ MIME(Multipurpose Internet Mail Extensions) ํ์ค์ ์ฌ์ฉํ๋ ๋ณต์กํ ํ์๊ณผ ์ฒจ๋ถ ํ์ผ์ด ์๋ ์ด๋ฉ์ผ์ ์์ฑ, ์ ์ก ๋ฐ ์์ ํ๋ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ์ด ํฌ๊ด์ ์ธ ๊ฐ์ด๋๋ ํ์ด์ฌ์ email
ํจํค์ง๋ฅผ ์ฌ์ฉํ์ฌ MIME ๋ฉ์์ง ๊ตฌ์ฑ ๋ฐ ํ์ฑ์ ํ์ํ๋ฉฐ ์ค์ฉ์ ์ธ ์์ ์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ ๊ณตํฉ๋๋ค.
MIME ์ดํดํ๊ธฐ
์ฝ๋์ ๋ค์ด๊ฐ๊ธฐ ์ ์ MIME๊ฐ ๋ฌด์์ธ์ง ์ดํดํ๋ ๊ฒ์ด ํ์์ ์ ๋๋ค. MIME๋ ๊ธฐ๋ณธ ์ด๋ฉ์ผ ํ์์ ํ์ฅํ์ฌ ๋ค์์ ์ง์ํฉ๋๋ค:
- ASCII๊ฐ ์๋ ๋ฌธ์ ์ธํธ์ ํ ์คํธ.
- ์ค๋์ค, ๋น๋์ค, ์ด๋ฏธ์ง ๋ฐ ์์ฉ ํ๋ก๊ทธ๋จ ํ์ผ์ ์ฒจ๋ถ ํ์ผ.
- ์ฌ๋ฌ ๋ถ๋ถ์ผ๋ก ๋ ๋ฉ์์ง ๋ณธ๋ฌธ.
- ASCII๊ฐ ์๋ ๋ฌธ์ ์ธํธ์ ํค๋ ํ๋.
MIME ๋ฉ์์ง๋ ๊ณ์ธต์ ์ผ๋ก ๊ตฌ์กฐํ๋ฉ๋๋ค. ์ต์์ ๋ฉ์์ง๋ ํ๋ ์ด์์ ๋ฉ์์ง ๋ถ๋ถ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ๊ฐ ๋ถ๋ถ์๋ Content-Type
, Content-Disposition
๋ฐ ๊ธฐํ ๊ด๋ จ ์ ๋ณด๋ฅผ ์ ์ํ๋ ์์ฒด ํค๋๊ฐ ์์ต๋๋ค. Content-Type
ํค๋๋ ๋ถ๋ถ์ ๋ฏธ๋์ด ์ ํ(์: text/plain
, text/html
, image/jpeg
, application/pdf
)์ ์ง์ ํฉ๋๋ค.
ํ๊ฒฝ ์ค์
ํ์ด์ฌ์ email
ํจํค์ง๋ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ผ๋ถ์ด๋ฏ๋ก ๋ณ๋๋ก ์ค์นํ ํ์๊ฐ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ฉ์ผ์ ๋ณด๋ด๋ ค๋ฉด smtplib
์ ์ค์นํด์ผ ํ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค. ๋ํ 2๋จ๊ณ ์ธ์ฆ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ด๋ฉ์ผ ์ ๊ณต์
์ฒด์์ "๋ ์์ ํ ์ฑ"์ ํ์ฉํ๋๋ก ๊ตฌ์ฑํ๊ฑฐ๋ ์ฑ ๋น๋ฐ๋ฒํธ๋ฅผ ์์ฑํด์ผ ํ ์ ์์ต๋๋ค.
์ด๋ฉ์ผ์ ๋ณด๋ด๋ ค๋ฉด ์ผ๋ฐ์ ์ผ๋ก SMTP(Simple Mail Transfer Protocol) ํด๋ผ์ด์ธํธ ์ธ์
๊ฐ์ฒด๋ฅผ ์ ๊ณตํ๋ smtplib
๋ชจ๋์ ์ฌ์ฉํฉ๋๋ค.
๊ฐ๋จํ ํ ์คํธ ์ด๋ฉ์ผ ๊ตฌ์ฑ
๊ธฐ๋ณธ ํ ์คํธ ์ด๋ฉ์ผ์ ์์ฑํ๊ณ ๋ณด๋ด๋ ๊ฐ๋จํ ์์ ๋ก ์์ํด ๋ณด๊ฒ ์ต๋๋ค.
์์ : ๊ธฐ๋ณธ ํ ์คํธ ์ด๋ฉ์ผ ๋ณด๋ด๊ธฐ
```python import smtplib from email.message import EmailMessage # ์ด๋ฉ์ผ ๊ตฌ์ฑ sender_email = "your_email@example.com" # ์ด๋ฉ์ผ ์ฃผ์๋ก ๋ฐ๊พธ์ธ์ recipient_email = "recipient_email@example.com" # ์์ ์ ์ด๋ฉ์ผ ์ฃผ์๋ก ๋ฐ๊พธ์ธ์ password = "your_password" # ์ด๋ฉ์ผ ๋น๋ฐ๋ฒํธ ๋๋ ์ฑ ๋น๋ฐ๋ฒํธ๋ก ๋ฐ๊พธ์ธ์ # ์ด๋ฉ์ผ ๋ฉ์์ง ์์ฑ msg = EmailMessage() msg['Subject'] = 'Python์์ ๋ณด๋ด๋ ์๋ ํ์ธ์!' msg['From'] = sender_email msg['To'] = recipient_email msg.set_content('์ด๊ฒ์ Python์์ ๋ณด๋ธ ์ผ๋ฐ ํ ์คํธ ์ด๋ฉ์ผ์ ๋๋ค.') # ์ด๋ฉ์ผ ๋ณด๋ด๊ธฐ try: with smtplib.SMTP_SSL('smtp.gmail.com', 465) as smtp: smtp.login(sender_email, password) smtp.send_message(msg) print("์ด๋ฉ์ผ์ด ์ฑ๊ณต์ ์ผ๋ก ์ ์ก๋์์ต๋๋ค!") except Exception as e: print(f"์ด๋ฉ์ผ ์ ์ก ์ค๋ฅ: {e}") ```
์ค๋ช :
- ์ด๋ฉ์ผ ๋ณด๋ด๊ธฐ์ฉ
smtplib
๊ณผ ์ด๋ฉ์ผ ์์ฑ์ ์ํEmailMessage
๋ฑ ํ์ํ ๋ชจ๋์ ๊ฐ์ ธ์ต๋๋ค. - ๋ณด๋ธ ์ฌ๋์ ์ด๋ฉ์ผ ์ฃผ์, ์์ ์์ ์ด๋ฉ์ผ ์ฃผ์ ๋ฐ ๋น๋ฐ๋ฒํธ(๋๋ ์ฑ ๋น๋ฐ๋ฒํธ)๋ฅผ ์ ์ํฉ๋๋ค. ์ค์: ๋น๋ฐ๋ฒํธ์ ๊ฐ์ ๋ฏผ๊ฐํ ์ ๋ณด๋ ์ฝ๋์ ์ ๋ ํ๋์ฝ๋ฉํ์ง ๋ง์ธ์. ๋์ ํ๊ฒฝ ๋ณ์๋ ๋ณด์ ๊ตฌ์ฑ ํ์ผ์ ์ฌ์ฉํ์ธ์.
EmailMessage
๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค.Subject
,From
,To
ํค๋๋ฅผ ์ค์ ํฉ๋๋ค.set_content()
๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฉ์ผ ๋ณธ๋ฌธ์ ์ผ๋ฐ ํ ์คํธ๋ก ์ค์ ํฉ๋๋ค.- SMTP ์๋ฒ(์ด ๊ฒฝ์ฐ SSL์ ์ฌ์ฉํ๋ Gmail SMTP ์๋ฒ)์ ์ฐ๊ฒฐํ๊ณ ๋ณด๋ธ ์ฌ๋์ ์๊ฒฉ ์ฆ๋ช ์ ์ฌ์ฉํ์ฌ ๋ก๊ทธ์ธํฉ๋๋ค.
smtp.send_message(msg)
๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฉ์ผ์ ๋ณด๋ ๋๋ค.- ์ด๋ฉ์ผ ์ ์ก ์ค ๋ฐ์ํ ์ ์๋ ์์ธ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
์ฒจ๋ถ ํ์ผ์ด ์๋ MIME ๋ฉ์์ง ๊ตฌ์ฑ
์ฒจ๋ถ ํ์ผ์ด ์๋ ์ด๋ฉ์ผ์ ๋ณด๋ด๋ ค๋ฉด ์ฌ๋ฌ ๋ถ๋ถ์ผ๋ก ๋ MIME ๋ฉ์์ง๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค. MIMEMultipart
ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ๋ณธ ๋ฉ์์ง๋ฅผ ๊ตฌ์ฑํ๊ณ MIMEText
, MIMEImage
, MIMEAudio
๋ฐ MIMEApplication
ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋ณ ๋ถ๋ถ์ ๋ง๋ญ๋๋ค.
์์ : ํ ์คํธ์ ์ด๋ฏธ์ง ์ฒจ๋ถ ํ์ผ์ด ์๋ ์ด๋ฉ์ผ ๋ณด๋ด๊ธฐ
```python import smtplib from email.message import EmailMessage from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.image import MIMEImage # ์ด๋ฉ์ผ ๊ตฌ์ฑ sender_email = "your_email@example.com" # ์ด๋ฉ์ผ ์ฃผ์๋ก ๋ฐ๊พธ์ธ์ recipient_email = "recipient_email@example.com" # ์์ ์ ์ด๋ฉ์ผ ์ฃผ์๋ก ๋ฐ๊พธ์ธ์ password = "your_password" # ์ด๋ฉ์ผ ๋น๋ฐ๋ฒํธ ๋๋ ์ฑ ๋น๋ฐ๋ฒํธ๋ก ๋ฐ๊พธ์ธ์ # ๋ค์ค ๋ถ๋ถ ๋ฉ์์ง ์์ฑ msg = MIMEMultipart() msg['Subject'] = 'ํ ์คํธ ๋ฐ ์ด๋ฏธ์ง ์ฒจ๋ถ ํ์ผ์ด ์๋ ์ด๋ฉ์ผ' msg['From'] = sender_email msg['To'] = recipient_email # ์ผ๋ฐ ํ ์คํธ ๋ถ๋ถ ์ถ๊ฐ text = MIMEText('์ด๊ฒ์ ์ด๋ฉ์ผ์ ์ผ๋ฐ ํ ์คํธ ๋ถ๋ถ์ ๋๋ค.', 'plain') msg.attach(text) # HTML ๋ถ๋ถ ์ถ๊ฐ (์ ํ ์ฌํญ) html = MIMEText('
์ด๊ฒ์ ์ด๋ฉ์ผ์ HTML ๋ถ๋ถ์ ๋๋ค.
์ค๋ช :
MIMEMultipart
,MIMEText
,MIMEImage
๋ฑ ํ์ํ ๋ชจ๋์ ๊ฐ์ ธ์ต๋๋ค.- ์ด๋ฉ์ผ์ ๋ค๋ฅธ ๋ถ๋ถ์ ๋ด์
MIMEMultipart
๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค. - ์ผ๋ฐ ํ
์คํธ ๋ถ๋ถ์ ์ํ
MIMEText
๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๊ธฐ๋ณธ ๋ฉ์์ง์ ์ฒจ๋ถํฉ๋๋ค. - HTML ๋ถ๋ถ์ ์ํ ๋ ๋ค๋ฅธ
MIMEText
๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๊ธฐ๋ณธ ๋ฉ์์ง์ ์ฒจ๋ถํฉ๋๋ค. ์ด๋ฏธ์ง ์๋ฒ ๋ฉ์ ์ฌ์ฉ๋๋Content-ID
ํค๋๋ฅผ ์ฐธ๊ณ ํ์ธ์. - ์ด๋ฏธ์ง ํ์ผ์ ์ด์ง ์ฝ๊ธฐ ๋ชจ๋(
'rb'
)๋ก ์ด๊ณMIMEImage
๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๊ธฐ๋ณธ ๋ฉ์์ง์ ์ฒจ๋ถํฉ๋๋ค. - ์ด์ ๊ณผ ๊ฐ์ด ์ด๋ฉ์ผ์ ๋ณด๋ ๋๋ค.
๋ค๋ฅธ ์ฒจ๋ถ ํ์ผ ํ์ ์ฒ๋ฆฌ
์ ์ ํ MIME ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ์์ ์์ ๋ฅผ ๋ค๋ฅธ ์ฒจ๋ถ ํ์ผ ํ์์ผ๋ก ์กฐ์ ํ ์ ์์ต๋๋ค:
MIMEAudio
: ์ค๋์ค ํ์ผ์ฉ.MIMEApplication
: ์ผ๋ฐ ์์ฉ ํ๋ก๊ทธ๋จ ํ์ผ(์: PDF, ZIP)์ฉ.
์๋ฅผ ๋ค์ด, PDF ํ์ผ์ ์ฒจ๋ถํ๋ ค๋ฉด ๋ค์ ์ฝ๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.
```python from email.mime.application import MIMEApplication with open('document.pdf', 'rb') as pdf_file: pdf = MIMEApplication(pdf_file.read(), _subtype='pdf') pdf.add_header('Content-Disposition', 'attachment', filename='document.pdf') msg.attach(pdf) ```
Content-Disposition
ํค๋๋ ์ด๋ฉ์ผ ํด๋ผ์ด์ธํธ์๊ฒ ์ฒจ๋ถ ํ์ผ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์๋ ค์ค๋๋ค. attachment
๊ฐ์ ํ์ผ์ ์ธ๋ผ์ธ์ผ๋ก ํ์ํ๋ ๋์ ๋ค์ด๋ก๋ํด์ผ ํจ์ ๋ํ๋
๋๋ค.
MIME ๋ฉ์์ง ํ์ฑ
ํ์ด์ฌ์ email
ํจํค์ง๋ MIME ๋ฉ์์ง๋ฅผ ํ์ฑํ๋ ๊ธฐ๋ฅ๋ ์ ๊ณตํฉ๋๋ค. ์ด๋ ๋ค์ด์ค๋ ์ด๋ฉ์ผ์ ์ฒ๋ฆฌํ๊ฑฐ๋, ์ฒจ๋ถ ํ์ผ์ ์ถ์ถํ๊ฑฐ๋, ์ด๋ฉ์ผ ์ฝํ
์ธ ๋ฅผ ๋ถ์ํด์ผ ํ ๋ ์ ์ฉํฉ๋๋ค.
์์ : ์ด๋ฉ์ผ ๋ฉ์์ง ํ์ฑ
```python import email from email.policy import default # ์ํ ์ด๋ฉ์ผ ๋ฉ์์ง (์ค์ ์ด๋ฉ์ผ ์ฝํ ์ธ ๋ก ๋ฐ๊พธ์ธ์) email_string = ''' From: sender@example.com To: recipient@example.com Subject: ์ฒจ๋ถ ํ์ผ์ด ์๋ ํ ์คํธ ์ด๋ฉ์ผ Content-Type: multipart/mixed; boundary="----boundary" ------boundary Content-Type: text/plain ์ด๊ฒ์ ์ด๋ฉ์ผ์ ์ผ๋ฐ ํ ์คํธ ๋ถ๋ถ์ ๋๋ค. ------boundary Content-Type: application/pdf; name="document.pdf" Content-Disposition: attachment; filename="document.pdf" ... (์ฌ๊ธฐ์ PDF ํ์ผ ๋ด์ฉ - ์ด์ง ๋ฐ์ดํฐ๊ฐ ๋ ๊ฒ์ ๋๋ค) ... ------boundary-- ''' # ์ด๋ฉ์ผ ๋ฉ์์ง ํ์ฑ msg = email.message_from_string(email_string, policy=default) # ์ด๋ฉ์ผ ํค๋ ์ก์ธ์ค print(f"From: {msg['From']}") print(f"To: {msg['To']}") print(f"Subject: {msg['Subject']}") # ๋ฉ์์ง ๋ถ๋ถ์ ๋ฐ๋ณต for part in msg.walk(): content_type = part.get_content_type() content_disposition = part.get('Content-Disposition') if content_type == 'text/plain': print(f"\n์ผ๋ฐ ํ ์คํธ:\n{part.get_payload()}") elif content_disposition: filename = part.get_filename() if filename: print(f"\n์ฒจ๋ถ ํ์ผ: {filename}") # ์ฒจ๋ถ ํ์ผ์ ํ์ผ๋ก ์ ์ฅ with open(filename, 'wb') as f: f.write(part.get_payload(decode=True)) print(f"์ฒจ๋ถ ํ์ผ '{filename}'์ด(๊ฐ) ์ ์ฅ๋์์ต๋๋ค.") ```
์ค๋ช :
email
๋ชจ๋๊ณผdefault
์ ์ฑ ์ ๊ฐ์ ธ์ต๋๋ค.- ์ํ ์ด๋ฉ์ผ ๋ฉ์์ง ๋ฌธ์์ด์ ์ ์ํฉ๋๋ค (์ค์ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ์ด๋ฉ์ผ ์๋ฒ ๋๋ ํ์ผ์์ ๊ฐ์ ธ์ฌ ๊ฒ์ ๋๋ค).
email.message_from_string()
์ ์ฌ์ฉํ์ฌ ์ต์ ํ์ฑ ๋์์ ์ํดdefault
์ ์ฑ ์ ์ฌ์ฉํ์ฌ ์ด๋ฉ์ผ ๋ฌธ์์ด์EmailMessage
๊ฐ์ฒด๋ก ํ์ฑํฉ๋๋ค.- ๋์
๋๋ฆฌ ์ ์ฌ ์ก์ธ์ค(์:
msg['From']
)๋ฅผ ํตํด ์ด๋ฉ์ผ ํค๋์ ์ก์ธ์คํ ์ ์์ต๋๋ค. msg.walk()
๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ์์ง์ ๋ชจ๋ ๋ถ๋ถ(๊ธฐ๋ณธ ๋ฉ์์ง ๋ฐ ๋ชจ๋ ์ฒจ๋ถ ํ์ผ ํฌํจ)์ ๋ฐ๋ณตํฉ๋๋ค.- ๊ฐ ๋ถ๋ถ์ ๋ํด
Content-Type
๋ฐContent-Disposition
ํค๋๋ฅผ ํ์ธํ์ฌ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ ๊ฒฐ์ ํฉ๋๋ค. - ๋ถ๋ถ์ด ์ผ๋ฐ ํ
์คํธ์ธ ๊ฒฝ์ฐ
part.get_payload()
๋ฅผ ์ฌ์ฉํ์ฌ ํ์ด๋ก๋๋ฅผ ์ถ์ถํฉ๋๋ค. - ๋ถ๋ถ์ด ์ฒจ๋ถ ํ์ผ์ธ ๊ฒฝ์ฐ
part.get_filename()
์ ์ฌ์ฉํ์ฌ ํ์ผ ์ด๋ฆ์ ์ถ์ถํ๊ณ ์ฒจ๋ถ ํ์ผ์ ํ์ผ๋ก ์ ์ฅํฉ๋๋ค.decode=True
์ธ์๋ ํ์ด๋ก๋๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๋์ฝ๋ฉ๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
๋ชจ๋ฒ ์ฌ๋ก ๋ฐ ๋ณด์ ๊ณ ๋ ค ์ฌํญ
ํ์ด์ฌ์์ ์ด๋ฉ์ผ ์์ ์ ํ ๋๋ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๊ณ ๋ณด์์์ ์ํฅ์ ๊ณ ๋ คํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
- ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ ํ๋์ฝ๋ฉํ์ง ๋ง์ธ์: ํ๊ฒฝ ๋ณ์, ๊ตฌ์ฑ ํ์ผ ๋๋ ๋น๋ฐ ๊ด๋ฆฌ ์์คํ ์ ์ฌ์ฉํ์ฌ ๋น๋ฐ๋ฒํธ ๋ฐ ๊ธฐํ ๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ ์์ ํ๊ฒ ์ ์ฅํ์ธ์.
- SSL/TLS ์ฌ์ฉ: SMTP ์๋ฒ์ ์ฐ๊ฒฐํ ๋๋ ํญ์ SSL/TLS ์ํธํ๋ฅผ ์ฌ์ฉํ์ฌ ์๊ฒฉ ์ฆ๋ช ๊ณผ ์ด๋ฉ์ผ ์ฝํ ์ธ ๋ฅผ ๋ณดํธํ์ธ์.
- ์ด๋ฉ์ผ ์ฃผ์ ์ ํจ์ฑ ๊ฒ์ฌ: ์ด๋ฉ์ผ์ ๋ณด๋ด๊ธฐ ์ ์ ์ ๊ท ํํ์์ด๋ ์ ์ฉ ์ด๋ฉ์ผ ์ ํจ์ฑ ๊ฒ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฉ์ผ ์ฃผ์๋ฅผ ์ ํจ์ฑ ๊ฒ์ฌํ์ธ์. ์ด๋ ๊ฒ ํ๋ฉด ์๋ชป๋ ์ฃผ์๋ก ์ด๋ฉ์ผ์ ๋ณด๋ด๋ ๊ฒ์ ๋ฐฉ์งํ๊ณ ์คํจ๋จธ๋ก ํ๋๊ทธ ์ง์ ๋ ์ํ์ ์ค์ผ ์ ์์ต๋๋ค.
- ์์ธ๋ฅผ ์ฐ์ํ๊ฒ ์ฒ๋ฆฌ: ์ด๋ฉ์ผ ๋ณด๋ด๊ธฐ ๋ฐ ํ์ฑ ์ค์ ๋ฐ์ํ ์ ์๋ ์์ธ๋ฅผ ํฌ์ฐฉํ๊ธฐ ์ํด ์ ์ ํ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๊ตฌํํ์ธ์. ๋๋ฒ๊น ๋ชฉ์ ์ผ๋ก ์ค๋ฅ๋ฅผ ๊ธฐ๋กํ์ธ์.
- ์ด๋ฉ์ผ ์ ํ ์ฌํญ ์ฃผ์: ๋๋ถ๋ถ์ ์ด๋ฉ์ผ ์ ๊ณต์ ์ฒด๋ ํ๋ฃจ ๋๋ ์๊ฐ๋น ๋ณด๋ผ ์ ์๋ ์ด๋ฉ์ผ ์์ ์ ํ์ด ์์ต๋๋ค. ๊ณ์ ์ด ์ ์ง๋๋ ๊ฒ์ ๋ฐฉ์งํ๋ ค๋ฉด ์ด๋ฌํ ์ ํ์ ์ด๊ณผํ์ง ๋ง์ธ์.
- ์ด๋ฉ์ผ ์ฝํ ์ธ ์ ๋ฆฌ: ๋์ ์ผ๋ก ์ด๋ฉ์ผ ์ฝํ ์ธ ๋ฅผ ์์ฑํ ๋๋ ์ฌ์ฉ์ ์ ๋ ฅ์ ์ ๋ฆฌํ์ฌ ์ฌ์ดํธ ๊ฐ ์คํฌ๋ฆฝํ (XSS) ์ทจ์ฝ์ ์ ๋ฐฉ์งํ์ธ์.
- DKIM, SPF ๋ฐ DMARC ๊ตฌํ: ์ด๋ฌํ ์ด๋ฉ์ผ ์ธ์ฆ ํ๋กํ ์ฝ์ ์ด๋ฉ์ผ ์คํธํ ๋ฐ ํผ์ฑ ๊ณต๊ฒฉ์ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ์ด๋ฌํ ํ๋กํ ์ฝ์ ์ฌ์ฉํ๋๋ก ์ด๋ฉ์ผ ์๋ฒ ๋ฐ DNS ๋ ์ฝ๋๋ฅผ ๊ตฌ์ฑํ์ธ์.
๊ณ ๊ธ ๊ธฐ๋ฅ ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
ํ์ด์ฌ์ email
ํจํค์ง๋ ์ด๋ฉ์ผ ์์
์ ์ํ ๋ง์ ๊ณ ๊ธ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ๋ค์์ ์ฃผ๋ชฉํ ๋งํ ๊ธฐ๋ฅ์
๋๋ค.
- ๋ฌธ์ ์ธ์ฝ๋ฉ:
email
ํจํค์ง๋ ๋ฌธ์ ์ธ์ฝ๋ฉ์ ์๋์ผ๋ก ์ฒ๋ฆฌํ์ฌ ๋ค์ํ ์ด๋ฉ์ผ ํด๋ผ์ด์ธํธ์์ ์ด๋ฉ์ผ์ด ์ฌ๋ฐ๋ฅด๊ฒ ํ์๋๋๋ก ํฉ๋๋ค. - ํค๋ ์กฐ์:
EmailMessage
๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฉ์ผ ํค๋๋ฅผ ์ฝ๊ฒ ์ถ๊ฐ, ์์ ๋ฐ ์ ๊ฑฐํ ์ ์์ต๋๋ค. - ์ฝํ
์ธ ์ธ์ฝ๋ฉ:
email
ํจํค์ง๋ Base64 ๋ฐ Quoted-Printable์ ๊ฐ์ ๋ค์ํ ์ฝํ ์ธ ์ธ์ฝ๋ฉ ์ฒด๊ณ๋ฅผ ์ง์ํฉ๋๋ค. - ์ด๋ฉ์ผ ์ ์ฑ
:
email.policy
๋ชจ๋์ ์ฌ์ฉํ๋ฉด ์ด๋ฉ์ผ ๋ฉ์์ง์ ํ์ฑ ๋ฐ ์์ฑ์ ์ฌ์ฉ์ ์ ์ํ ์ ์์ต๋๋ค.
ํ์ค email
ํจํค์ง ์ธ์๋ ๋ช ๊ฐ์ง ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด ํ์ด์ฌ์์ ์ด๋ฉ์ผ ์ฒ๋ฆฌ๋ฅผ ๊ฐ์ํํ ์ ์์ต๋๋ค.
- yagmail: ์ด๋ฉ์ผ์ ๋ณด๋ด๊ธฐ ์ํ ๊ฐ๋จํ๊ณ ์ฌ์ฉํ๊ธฐ ์ฌ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
- Flask-Mail: Flask ์น ํ๋ ์์ํฌ์ฉ ํ์ฅ ํ๋ก๊ทธ๋จ์ผ๋ก, Flask ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ด๋ฉ์ผ์ ๋ณด๋ด๋ ๊ฒ์ ๋จ์ํํฉ๋๋ค.
- django.core.mail: Django ์น ํ๋ ์์ํฌ์ ์ด๋ฉ์ผ ๋ณด๋ด๊ธฐ์ฉ ๋ชจ๋์ ๋๋ค.
๊ตญ์ ํ ๊ณ ๋ ค ์ฌํญ
์ ์ธ๊ณ์ ์ธ ์ฒญ์ค์ ์ํ ์ด๋ฉ์ผ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ๋๋ ๋ค์ ๊ตญ์ ํ ์ธก๋ฉด์ ๊ณ ๋ คํ์ธ์.
- ๋ฌธ์ ์ธ์ฝ๋ฉ: ๋ค์ํ ์ธ์ด์ ๊ด๋ฒ์ํ ๋ฌธ์๋ฅผ ์ง์ํ๊ธฐ ์ํด ์ด๋ฉ์ผ ์ฝํ ์ธ ๋ฐ ํค๋์ UTF-8 ์ธ์ฝ๋ฉ์ ์ฌ์ฉํ์ธ์.
- ๋ ์ง ๋ฐ ์๊ฐ ํ์: ์ง์ญ๋ณ ๋ ์ง ๋ฐ ์๊ฐ ํ์์ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ์นํ์ ์ธ ๋ฐฉ์์ผ๋ก ๋ ์ง์ ์๊ฐ์ ํ์ํ์ธ์.
- ์ธ์ด ์ง์: ์ฌ๋ฌ ์ธ์ด๋ฅผ ์ง์ํ๊ธฐ ์ํด ์ด๋ฉ์ผ ํ ํ๋ฆฟ ๋ฐ ์ฌ์ฉ์ ์ธํฐํ์ด์ค์ ๋ํ ๋ฒ์ญ์ ์ ๊ณตํ์ธ์.
- ์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ ์ธ์ด: ์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ ์ธ์ด(์: ์๋์ด, ํ๋ธ๋ฆฌ์ด)๋ฅผ ์ง์ํ๋ ๊ฒฝ์ฐ ์ด๋ฉ์ผ ์ฝํ ์ธ ๋ฐ ๋ ์ด์์์ด ์ฌ๋ฐ๋ฅด๊ฒ ํ์๋๋์ง ํ์ธํ์ธ์.
๊ฒฐ๋ก
ํ์ด์ฌ์ email
ํจํค์ง๋ MIME ๋ฉ์์ง๋ฅผ ๊ตฌ์ฑํ๊ณ ํ์ฑํ๋ ๊ฐ๋ ฅํ๊ณ ๋ค์ฌ๋ค๋ฅํ ๋๊ตฌ์
๋๋ค. MIME ์์น์ ์ดํดํ๊ณ ์ ์ ํ ํด๋์ค์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋ณต์กํ ํ์, ์ฒจ๋ถ ํ์ผ ๋ฐ ๊ตญ์ ํ ์๊ตฌ ์ฌํญ์ ์ฒ๋ฆฌํ๋ ์ ๊ตํ ์ด๋ฉ์ผ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ง๋ค ์ ์์ต๋๋ค. ์ด๋ฉ์ผ ์ ํ๋ฆฌ์ผ์ด์
์ด ์์ ์ ์ด๊ณ ์์ ํ๋ฉฐ ์ฌ์ฉ์ ์นํ์ ์ธ์ง ํ์ธํ๊ธฐ ์ํด ๋ชจ๋ฒ ์ฌ๋ก์ ๋ณด์ ์ง์นจ์ ๋ฐ๋ฅด๋ ๊ฒ์ ์์ง ๋ง์ธ์. ๊ธฐ๋ณธ ํ
์คํธ ์ด๋ฉ์ผ์์ ๋ณต์กํ ๋ค์ค ๋ถ๋ถ ๋ฉ์์ง๊น์ง, ํ์ด์ฌ์ ํจ๊ณผ์ ์ผ๋ก ์ด๋ฉ์ผ ํต์ ์ ๊ด๋ฆฌํ๋ ๋ฐ ํ์ํ ๋ชจ๋ ๊ฒ์ ์ ๊ณตํฉ๋๋ค.